UIViewController 的 init 和 viewDidLoad 执行顺序带来的有趣现象
Contents
这是一个 vc 的 init
方法。
- (instancetype)init {
self = [super init];
if (self) {
//do bala bala
}
return self;
}
这是一个 vc 的 viewDidLoad
方法。
- (void)viewDidLoad {
[super viewDidLoad];
}
通常情况下 init
会先执行(实际上一直都是先执行)。
然而,如果在 init
中有调用 self.view
(Access to the view)的动作的话,情况就变得不一样了。
- (instancetype)init {
self = [super init];
if (self) {
UITableView *tableView = [UITableView new];
[self.view addSubView:v];
}
return self;
}
vc 会从 self = [super init];
开始执行一直走到 [self.view addSubView:v];
之前提前跳到 viewDidLoad
方法,执行完毕才会回到 [self.view addSubView:v];
继续执行。
试想一下,如果在
viewDidLoad
中设置了一个 hud 并且是 add 到self.view
上的,按照这个顺序,接下来self.view
中会在init
方法中 add 一个UITableView
。这样一来根据 add 的先后顺序,hud 会在UITableView
的下方不可见。如果在
init
方法中有对NSMutableArray
类似的变量初始化动作NSMutableArray *array = [@[] mutableCopy];
且 viewDidLoad
中有用到的话由于还没有来得及初始化就发送消息,addObject 这样的操作便是无效的。